#!/usr/bin/python

from agente import *
from lex import *
from stoplist import *
from math import *
from resultado import *
from parser import *

def analizarPregunta(texto):
	StopList()
	cargarAnalizador(texto)
	palabras = []
	pesos = []
	palabra = obtenerToken()
	peso = obtenerToken()
	while True:
		if palabra and StopList().estaEn(palabra.value):
			palabra,peso = ignorar(palabra,peso)
		if palabra and (palabra.type == 'PALABRA' or palabra.type == 'MAIL'
										or palabra.type == 'FECHA'):
			palabras.append(palabra.value.lower())
		else:
			break
		if peso and peso.type == 'NUMERO_REAL':
			pesos.append(float(peso.value))
			palabra = obtenerToken()
			peso = obtenerToken()
		else:
			pesos.append(1.0)
			palabra = peso
			peso = obtenerToken()
	resultados = semejanza(palabras,pesos)
	exportarXML(palabras, resultados)
	return resultados

def ignorar(palabra, peso):
	if peso.type == 'NUMERO_REAL':
		palabra = obtenerToken()
		peso = obtenerToken()
	else:
		palabra = peso
		peso = obtenerToken()
	return palabra,peso

def semejanza(palabras,pesos):
	numDoc = Agente().countDoc()
	result = []
	terminos = []
	for p in range(0,len(palabras)):
		terminos.append(Agente().getTermino(palabras[p]))
	for i in range(1,numDoc+1):
		result.append(Resultado(i,sem(palabras,pesos,terminos,i,numDoc)))
	result.sort()
	return result
	
def sem(palabras,pesos,terminos,idDoc,numDoc):
	numerador = 0.0
	denominador1 = 0.0
	denominador2 = 0.0
	resultado = 0.0
	for i in range(0,len(palabras)):
		wpj = pesos[i]
		wpj2 = wpj * wpj
		if terminos[i]:
			fdj = terminos[i][0][2]
			ftij = Agente().getFrecuenciaTerminoDoc(terminos[i][0][0],idDoc)
		else:
			fdj = 0
			ftij = 0
		if fdj != 0:
			fidj = log10(numDoc/float(fdj))
		else:
			fidj = 0
		wij = ftij * fidj
		wij2 = wij * wij
		numerador += wpj * wij
		denominador1 += wpj2
		denominador2 += wij2
	denominador = sqrt(denominador1) * sqrt(denominador2)
	if denominador == 0:
		resultado = 0.0
	else:
		resultado = numerador/denominador
	return resultado
